#ifndef ITEM_H
#define ITEM_H

#include <QObject>

/** Один элемент дерева. */
class Item : public QObject{
	Q_OBJECT
	
	/** Первый текст эемента.*/
	Q_PROPERTY(QString text1 READ text1 WRITE setText1 NOTIFY text1Change)
	/** Вторй текст элемента.*/
	Q_PROPERTY(QString text2 READ text2 WRITE setText2 NOTIFY text2Change)
	/** Список дочерних элементов.*/
	Q_PROPERTY(QList<QObject*> childItems READ childItems NOTIFY childItemsChange)
	/** Имеет ли узел вложенные элементы.*/
	Q_PROPERTY(bool hasChild READ hasChild NOTIFY hasChildChange)
	/** Узел развёрнут.*/
	Q_PROPERTY(bool isOpen READ isOpen WRITE setOpen NOTIFY isOpenChange)
private:
	/** Первый текст эемента.*/
	QString m_text1;
	/** Второй текст элемента.*/
	QString m_text2;
	/** Список дочерних элементов.*/
	QList<QObject*> m_childItems;
	/** Узел развёрнут.*/
	bool m_isOpen;
public:
	explicit Item(const QString & text1, const QString & text2, QObject *parent = 0);
	
	/** Первый текст эемента.*/
	QString text1() const;
	/** Установить первый текст эемента.*/
	void setText1(const QString & text1);
	/** Второй текст элемента.*/
	QString text2() const;
	/** Установить второй текст элемента.*/
	void setText2(const QString & text2);
	/** Список дочерних элементов.*/
	QList<QObject*> childItems() const;
	/** Имеет ли узел вложенные элементы.*/
	bool hasChild() const;
	/** Узел развёрнут.*/
	bool isOpen() const;
	
	/** Добавить дочерний элемент. */
	void addChild(Item * child);
	
	/** Равернуть список дочерних элементов.*/
	void setOpen(bool open);
signals:
	/** Изменился первый текст эемента.*/
	void text1Change();
	/** Изменился второй текст элемента.*/
	void text2Change();
	/** Изменился список дчерних элементов.*/
	void childItemsChange();
	/** Изменился признак наличия вложенных элементов.*/
	void hasChildChange();
	/** Изменился признак развёрнутотсти узла.*/
	void isOpenChange();
public slots:
	
};

#endif // ITEM_H
